'use client'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { CheckCircle2 } from 'lucide-react'; import { fetchApi, getDateTime } from '@/lib/utils/client'; import Loading from '@/app/component/Loading'; import useCart from '@/hooks/useCart'; import type { OrderDetail } from '@/types/store'; function formatPrice(n: number): string { return n.toLocaleString('ko-KR'); } export default function OrderCompletePage() { const params = useParams<{ orderID: string }>(); const orderID = Number(params.orderID); const { clear } = useCart(); const [order, setOrder] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (Number.isNaN(orderID) || orderID <= 0) { setLoading(false); return; } (async () => { const res = await fetchApi(`/api/store/orders/${orderID}`, { silent: true }); if (res.success && res.data) { setOrder(res.data); // 결제 성공 페이지 진입 시점에 cart 비우기 (사용자가 결제 완료를 확인한 시점) clear(); } setLoading(false); })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [orderID]); if (loading) { return ; } if (!order) { return (

주문 정보를 찾을 수 없습니다.

주문 목록으로
); } const hasDigital = order.items.some(i => i.type === 2); const hasPhysical = order.items.some(i => i.type === 1); const guideText = hasDigital && !hasPhysical ? '쿠폰은 보관함에서 확인하실 수 있어요.' : hasPhysical && !hasDigital ? '배송 상태는 주문 목록에서 확인하실 수 있어요.' : '쿠폰은 보관함, 배송 상태는 주문 목록에서 확인하실 수 있어요.'; return (
{/* 헤더 */}

주문이 완료되었습니다

{guideText}

{/* 주문 요약 카드 */}
주문번호
{order.orderNumber}
결제 일시
{getDateTime(order.paidAt ?? order.createdAt)}
{order.items.map((item) => ( ))}
{item.productName}
{item.type === 2 ? '쿠폰' : '실물'} · 수량 {item.quantity}
{formatPrice(item.unitPrice * item.quantity)}P
결제 금액 {formatPrice(order.totalAmount)}P
{order.channelName && (
후원 채널: {order.channelName}
)}
{/* CTA 버튼 */}
{hasDigital && ( 보관함으로 )} 주문 상세로
쇼핑 계속하기 〉
); }